import sys, socket

# 从命令行参数中获取目标主机名
host = sys.argv[1]
# 从命令行参数中获取目标端口，以字符串形式表示
textport = sys.argv[2]

# 创建一个 UDP 套接字，socket.AF_INET 表示使用 IPv4 地址族，socket.SOCK_DGRAM 表示使用 UDP 协议
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
    # 尝试将端口字符串转换为整数
    port = int(textport)
except ValueError:
    # 若转换失败，说明传入的可能是服务名，通过服务名和协议类型获取对应的端口号
    port = socket.getservbyname(textport, 'udp')

# 连接到指定的主机和端口，这里的连接仅用于简化后续的 send 和 recv 操作，UDP 本身是无连接的
s.connect((host, port))

# 提示用户输入要发送的数据
print('Enter data to transmit: ')
# 从标准输入读取一行数据，并去除首尾的空白字符
data = sys.stdin.readline().strip()
# 将字符串数据编码为字节类型并发送给服务器
s.sendall(data.encode('utf-8'))

# 提示用户程序正在等待服务器的回复，按 Ctrl-C 或 Ctrl-Break 可停止
print('Looking for replies; press Ctrl-C or Ctrl-Break to stop')

while True:
    # 从套接字接收最多 2048 字节的数据
    buf = s.recv(2048)
    # 若接收到的数据长度为 0，说明没有更多数据，退出循环
    if not len(buf):
        break
    # 将接收到的字节数据解码为字符串并输出到标准输出
    sys.stdout.write(buf.decode('utf-8'))
    # 刷新标准输出缓冲区，确保数据立即显示
    sys.stdout.flush()

